//
//  HMUserAccountViewModel.swift
//  WeiboTT
//
//  Created by 王嘉涛 on 2016/11/15.
//  Copyright © 2016年 王嘉涛. All rights reserved.
//

import UIKit

class HMUserAccountViewModel: NSObject {

    // 视图模型需要应用, 模型对象
    var userAccount: HMUserAccount?
    
    // 单例对象, 全局只有一个登陆的用户
    static let shared: HMUserAccountViewModel = HMUserAccountViewModel()
    
    // 重写构造函数, 在用户已经登陆的情况下给模型赋值
    override init(){
        super.init()
        // 保证以后再判断是否登录的时候, 不在访问磁盘
        // 将磁盘数据保存在内存中
//        HMUserAccount = self
    }
    
    // 判断用户是否登录, 计算属性
    var userLogin: Bool{
        
        // 满足下面条件就认为用户已经登陆
        if userAccount?.access_token != nil && isExpires == false {
            return true
        }
        
        // 默认没有登录
        return false
    }
    
    //增加一个用户纯种URL类型的头像地址
    var headURL: URL? {
        return URL(string: userAccount?.avatar_large ?? "")
    }

    var access_token: String? {
        return userAccount?.access_token
    }

    //判断令牌是否过期
    var isExpires: Bool {
        //满足以下条件就认为没有过期
        //过期日期 比当前日期要大的时候就没有过期
        //2016.11.17  2016.11.15
        if userAccount?.expires_date?.compare(Date()) ==  ComparisonResult.orderedDescending {
            return false
        }
        //默认过期
        return true
    }

    // 获取用户token
    func loadAccessToken(code: String, finished: @escaping (Bool) -> ()) {
        let urlStirng = "https://api.weibo.com/oauth2/access_token"
        let parameters = ["client_id" : WB_APPKEY,
                          "client_secret" : WB_APPSECRET,
                          "grant_type" : "authorization_code",
                          "code" : code,
                          "redirect_uri" : WB_REDIRECTURI]
        HMNetworkTools.shared.request(method: .POST, urlString: urlStirng, parameters: parameters) { (responseObject, error) in
            if error != nil {
                //SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
                finished(false)
                return
            }
            //请求成功
            
            //使用access_token 和 uid 来请求用户信息\
            //获取用户信息
            self.loadUserInfo(dict: responseObject as! [String : Any],loadUserInfofinished: finished)
            
        }
        
    }
    
    private func loadUserInfo(dict: [String : Any],loadUserInfofinished: @escaping (Bool) -> ()) {
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        //OC中的字典可以存放nil吗?
        let parameters = ["access_token" : token,
                          "uid" : uid]
        print(parameters)
        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            if error != nil {
                //SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
                //执行失败的回调
                loadUserInfofinished(false)
                return
            }
            
            
            //将用户信息存储在本地
            //需要将授权之后的得到的字典和用户信息字典合并 之后再存储
            var userInfoDict = responseObject as! [String : Any]
            for (key,value) in dict {
                userInfoDict[key] = value
            }
            
            //需要将userInfodict转换模型对象
            //用归档的方式存储自定义模型对象
            //自定转模型
            let userAccount = HMUserAccount(dict: userInfoDict)
            self.saveUserAccount(userAccount: userAccount)
            //给单例对象的模型对象赋值
            //如果不写,首次登录的时候会有bug
            self.userAccount = userAccount
            //执行成功的回调
            loadUserInfofinished(true)
        }
    }
    
    
    /// 存储模型对象
    ///
    /// - Parameter userAccount: 模型
    private func saveUserAccount(userAccount: HMUserAccount) {
        //存储在沙盒的Document或者Library,temp 不会备份
        //拼接文件路径的方法String 没有 需要转换为NSString
        //使用默认转换的前提: 被转换的类型不能够为可选类型对象
        //存储自定义对象,自定义对象必须遵守 NSCoding协议 实现协议方法\
        print(path)
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: path)
        print(path)
    }
    
    // 读取磁盘
    func loadUserAccount() -> HMUserAccount? {
        //调用解档的方法
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: path)
        if let userAccount = account as? HMUserAccount {
            return userAccount
        }
        return nil
    }

    
}
